package OfferLanQiaoBei.a_12届蓝桥真题;

import java.util.ArrayList;

/*
小蓝有一个超大的仓库，可以摆放很多货物。
现在，小蓝有n箱货物要摆放在仓库，每箱货物都是规则的正方体。
小蓝规定了长、宽、高三个互相垂直的方向，每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆L、W、H的货物，满足n=LxWxH
给定n,请问有多少种堆放货物的方案满足要求。
例如，当n=4时，有以下6种方案: 1x1x4、1x2x2、1x4x1. 2x1x2.
2x2x1、4x1x1.
请问，当n = 2021041820210418 (注意有 16位数字)时，总共有多少种方案?

 */
public class d货物摆放 {
	public static void main(String[] args) {
		d货物摆放 test = new d货物摆放();
		test.useDeal();
	}
	
	public void useDeal() {
		int res = deal(2021041820210418d);
		System.out.println(res);
	}
	
	public int deal(double N) {
		ArrayList<Double> list = new ArrayList<Double>();
		int res = 0;
		/*
		这里运用了快速获取约数；
		假设N = 36;那么i <= 6；
		实际上36的约数含有18，但是i最大 = 6 < 18，
		正常来说下面一个for循环是会把18这种情况遗漏掉的
			所以我们需要if (N / i != i) {第二个判断
			因为i=2会被考虑到，所以我们N / i = 36 / 2 = 18
			这样就不会遗漏了
		 */
		for (double i = 1; i * i <= N; i++) {//这个循环就是找约数；找约束相当于对这个题进行预处理
			if (N % i == 0) {//先判断当前i是否满足约数
				list.add(i);//i满足
				if (N / i != i) {//判断i的兄弟约数；这里注意有可能i的兄弟约数=i，我们不能重复添加i，所以才有N / i != i的判断
					list.add(N / i);
				}
			}
		}
		
		for (Double x : list) {
			for (Double y : list) {
				for (Double z : list) {
					if (x * y * z == N) {
						res++;
					}
				}
			}
		}
		return res;
	}
}
